SmitearWebGL.Core.Math.Color = Class.extend(
{
	/******** constructor ********/

	init : function( r, g, b, a )
	{
		var t;

		/******** public property ********/

		this.r = r == undefined ? 1.0 : r;
		this.g = g == undefined ? 1.0 : g;
		this.b = b == undefined ? 1.0 : b;
		this.a = a == undefined ? 1.0 : a;

		this._registClass( "SmitearWebGL.Core.Math.Vector4" );
	}
	,

	/******** public method ********/

	identity : function()
	{
		this.r = this.g = this.b = 0.0;
		this.a = 1.0;
	}
	,
	copy : function( c )
	{
		c.a = this.a;
		c.r = this.r;
		c.g = this.g;
		c.b = this.b;
	}
	,
	add : function( c )
	{
		this.r += c.r;
		this.g += c.g;
		this.b += c.b;
		this.a += c.a;
	}
	,
	subtract : function( c )
	{
		this.r -= c.r;
		this.g -= c.g;
		this.b -= c.b;
		this.a -= c.a;
	}
	,
	multiply : function( c )
	{
		this.r *= c.r;
		this.g *= c.g;
		this.b *= c.b;
		this.a *= c.a;
	}
	,
	addFloat : function( f )
	{
		this.r += f;
		this.g += f;
		this.b += f;
		this.a += f;
	}
	,
	subtractFloat : function( f )
	{
		this.r -= f;
		this.g -= f;
		this.b -= f;
		this.a -= f;
	}
	,
	multiplyFloat : function( f )
	{
		this.r *= f;
		this.g *= f;
		this.b *= f;
		this.a *= f;
	}
	,
	toString : function()
	{
		return "SmitearWebGL.Core.Math.Color(" + this.r + ", " + this.g + ", " + this.b + ", " + this.a + ")";
	}
	,
	flatten : function()
	{
		return [this.r, this.g, this.b, this.a];
	}
	,
	flatten3v : function()
	{
		return [this.r, this.g, this.b];
	}
}
);

/******** static method ********/

SmitearWebGL.Core.Math.Color.create = function( r, g, b, a )
{
	return new SmitearWebGL.Core.Math.Color( r, g, b, a );
}

var $C = SmitearWebGL.Core.Math.Color.create;

/******** static property ********/

SmitearWebGL.Core.Math.Color.name = {
	aliceblue : 'f0f8ff', 		antiquewhite : 'faebd7', 	aqua : '00ffff',
	aquamarine : '7fffd4', 	azure : 'f0ffff', 		beige : 'f5f5dc',
	bisque : 'ffe4c4', 		black : '000000', 		blanchedalmond : 'ffebcd',
	blue : '0000ff', 			blueviolet : '8a2be2', 	brown : 'a52a2a',
	burlywood : 'deb887', 	cadetblue : '5f9ea0', 		chartreuse : '7fff00',
	chocolate : 'd2691e', 		coral : 'ff7f50', 		cornflowerblue : '6495ed',
	cornsilk : 'fff8dc', 		crimson : 'dc143c', 		cyan : '00ffff',
	darkblue : '00008b', 		darkcyan : '008b8b', 		darkgoldenrod : 'b8860b',
	darkgray : 'a9a9a9', 		darkgreen : '006400', 	darkkhaki : 'bdb76b',
	darkmagenta : '8b008b', 	darkolivegreen : '556b2f', 	darkorange : 'ff8c00',
	darkorchid : '9932cc', 	darkred : '8b0000', 		darksalmon : 'e9967a',
	darkseagreen : '8fbc8f', 	darkslateblue : '483d8b', 	darkslategray : '2f4f4f',
	darkturquoise : '00ced1', 	darkviolet : '9400d3', 	deeppink : 'ff1493',
	deepskyblue : '00bfff', 	dimgray : '696969', 		dodgerblue : '1e90ff',
	feldspar : 'd19275', 		firebrick : 'b22222', 		floralwhite : 'fffaf0',
	forestgreen : '228b22', 	fuchsia : 'ff00ff', 		gainsboro : 'dcdcdc',
	ghostwhite : 'f8f8ff', 		gold : 'ffd700', 			goldenrod : 'daa520',
	gray : '808080', 		green : '008000', 		greenyellow : 'adff2f',
	honeydew : 'f0fff0', 		hotpink : 'ff69b4', 		indianred : 'cd5c5c',
	indigo : '4b0082', 		ivory : 'fffff0', 		khaki : 'f0e68c',
	lavender : 'e6e6fa', 		lavenderblush : 'fff0f5', 	lawngreen : '7cfc00',
	lemonchiffon : 'fffacd', 	lightblue : 'add8e6', 		lightcoral : 'f08080',
	lightcyan : 'e0ffff', 		lightgoldenrodyellow : 'fafad2', 	lightgrey : 'd3d3d3',
	lightgreen : '90ee90', 	lightpink : 'ffb6c1', 		lightsalmon : 'ffa07a',
	lightseagreen : '20b2aa', 	lightskyblue : '87cefa', 	lightslateblue : '8470ff',
	lightslategray : '778899', 	lightsteelblue : 'b0c4de', 	lightyellow : 'ffffe0',
	lime : '00ff00', 			limegreen : '32cd32', 	linen : 'faf0e6',
	magenta : 'ff00ff', 		maroon : '800000', 		mediumaquamarine : '66cdaa',
	mediumblue : '0000cd', 	mediumorchid : 'ba55d3', 	mediumpurple : '9370d8',
	mediumseagreen : '3cb371', 	mediumslateblue : '7b68ee', 	mediumspringgreen : '00fa9a',
	mediumturquoise : '48d1cc', 	mediumvioletred : 'c71585', 	midnightblue : '191970',
	mintcream : 'f5fffa', 	mistyrose : 'ffe4e1', 		moccasin : 'ffe4b5',
	navajowhite : 'ffdead', 	navy : '000080', 		oldlace : 'fdf5e6',
	olive : '808000', 		olivedrab : '6b8e23', 		orange : 'ffa500',
	orangered : 'ff4500', 	orchid : 'da70d6', 		palegoldenrod : 'eee8aa',
	palegreen : '98fb98', 		paleturquoise : 'afeeee', 	palevioletred : 'd87093',
	papayawhip : 'ffefd5', 	peachpuff : 'ffdab9', 		peru : 'cd853f',
	pink : 'ffc0cb', 		plum : 'dda0dd', 		powderblue : 'b0e0e6',
	purple : '800080', 		red : 'ff0000', 		rosybrown : 'bc8f8f',
	royalblue : '4169e1', 		saddlebrown : '8b4513', 	salmon : 'fa8072',
	sandybrown : 'f4a460', 	seagreen : '2e8b57', 		seashell : 'fff5ee',
	sienna : 'a0522d', 		silver : 'c0c0c0', 		skyblue : '87ceeb',
	slateblue : '6a5acd', 		slategray : '708090', 	snow : 'fffafa',
	springgreen : '00ff7f', 	steelblue : '4682b4', 		tan : 'd2b48c',
	teal : '008080', 		thistle : 'd8bfd8', 		tomato : 'ff6347',
	turquoise : '40e0d0', 		violet : 'ee82ee', 		violetred : 'd02090',
	wheat : 'f5deb3', 		white : 'ffffff', 		whitesmoke : 'f5f5f5',
	yellow : 'ffff00', 		yellowgreen : '9acd32'
};

SmitearWebGL.Core.Math.Color.r32ftoa8r8g8b8 = function( fValue )
{
	var bitSh = [256*256*256, 256*256, 256, 1];
	var bitMsk = [0, 1.0/256.0, 1.0/256.0, 1.0/256.0];
	var comp1 = [fValue * bitSh[0], fValue * bitSh[1], fValue * bitSh[2], fValue * bitSh[3]];
	var comp2 = [comp1[0] - Math.floor(comp1[0]), comp1[1] - Math.floor(comp1[1]), comp1[2] - Math.floor(comp1[2]), comp1[3] - Math.floor(comp1[3])];
	var comp3 = [comp2[0] * bitMsk[0], comp2[0] * bitMsk[1], comp2[1] * bitMsk[2], comp2[2] * bitMsk[3]];
	var comp4 = [comp2[0] - comp3[0], comp2[1] - comp3[1], comp2[2] - comp3[2], comp2[3] - comp3[3]];
	
//	var bitSh = [1.0, 256.0, 65536.0, 16777216.0];
//	var comp1 = [fValue * bitSh[0], fValue * bitSh[1], fValue * bitSh[2], fValue * bitSh[3]];
//	var comp2 = [comp1[0] - Math.floor(comp1[0]), comp1[1] - Math.floor(comp1[1]), comp1[2] - Math.floor(comp1[2]), comp1[3] - Math.floor(comp1[3])];
//	var comp3 = [Math.floor(comp2[0] * 256), Math.floor(comp2[1] * 256), Math.floor(comp2[2] * 256), Math.floor(comp2[3] * 256)];
//	var comp4 = [comp3[0] / 256, comp3[1] / 256, comp3[2] / 256, comp3[3] / 256];
//	
//	var bitShifts = [1.0, 0.00390625, 0.0000152587890625, 0.000000059604644775390625];
//	var decode = comp4[0] * bitShifts[0] + comp4[1] * bitShifts[1] + comp4[2] * bitShifts[2] + comp4[3] * bitShifts[3];

	return comp4;
}

SmitearWebGL.Core.Math.Color.a8r8g8b8tor32f = function( r, g, b, a )
{
	var bitShifts = [1.0 / ( 256.0 * 256.0 * 256.0 ), 1.0 / ( 256.0 * 256.0 ), 1.0 / 256.0, 1];
	var decode = r * bitShifts[0] + g * bitShifts[1] + b * bitShifts[2] + a * bitShifts[3];

	return decode;
}

SmitearWebGL.Core.Math.Color.Channel =
{
	RED : 0,
	GREEN : 1,
	BLUE : 2,
	ALPHA : 3
}